iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0

28

最後我們來做一下明暗模式的功能就結束摟~

https://ithelp.ithome.com.tw/upload/images/20241007/20169170RepSw44YXO.png

這是html跟css的部分,我們創建了一個ThemeIcon.astro的檔案,並且在裡面添加了兩個圖案,一個是太陽(sun)一個是月亮(moon)的svg圖像,接下來我們來看一下style的內容

https://ithelp.ithome.com.tw/upload/images/20241007/20169170XxsRh9qKVV.png

我們可以看到一開始我們是將sun設成黑色,而moon是透明的,而在橘框中,當我們加上.dark這個calss後,sun就會變成透明的,而moon就會變成白色,最後我們來看script的內容

https://ithelp.ithome.com.tw/upload/images/20241007/20169170F3QfDric4k.png

我們這段程式碼透過立即執行函數(IIFE)和事件監聽器實現了動態主題切換(深色模式和淺色模式)的功能。以下是詳細的內容解釋:

1. 定義立即執行函數 (IIFE)

const theme = (() => {
	if (typeof localStorage !== 'undefined' && localStorage.getItem('theme')) {
		return localStorage.getItem('theme');
	}
	if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
		return 'dark';
	}
	return 'light';
})()
  • 這是一個立即執行函數表達式 (IIFE),它會立即執行並返回一個值,並將結果儲存到 theme 變數中。
  • 使用 localStorage 來儲存用戶的主題偏好。如果本地儲存中已有已保存的主題(theme),則使用它。
  • 如果沒有儲存主題,則透過 window.matchMedia('(prefers-color-scheme: dark)') 來檢查用戶的系統主題偏好。如果系統偏好是深色模式,返回 'dark',否則返回 'light'

2. 根據 theme 應用主題樣式

if (theme === 'light') {
	document.documentElement.classList.remove('dark');
} else {
	document.documentElement.classList.add('dark');
}
  • 根據 theme 變數的值,決定是否給 HTML 文件的根元素 <html>(即 document.documentElement)添加或移除 'dark' 類別。
  • 如果 theme'light',則移除 'dark' 類別,頁面會保持淺色主題;
  • 如果 theme'dark',則添加 'dark' 類別,頁面會變成深色主題。

3. 將 theme 儲存到 localStorage

window.localStorage.setItem('theme', theme);
  • 將當前的 theme 值儲存到 localStorage,這樣下次用戶進入時,可以記住他們的主題偏好。

4. 主題切換按鈕的點擊事件處理

const handleToggleClick = () => {
	const element = document.documentElement;
	element.classList.toggle('dark');
	const isDark = element.classList.contains('dark');
	localStorage.setItem('theme', isDark ? 'dark' : 'light');
};
  • 定義 handleToggleClick 函數,當用戶點擊主題切換按鈕時調用。
  • element.classList.toggle('dark') 會切換 HTML 根元素的 'dark' 類別。如果已有 'dark' 類別則移除,沒有的話則添加。
  • 檢查切換後是否包含 'dark' 類別,並將更新後的主題狀態儲存到 localStorage 中。

5. 添加事件監聽器

document.getElementById('themeToggle').addEventListener('click', handleToggleClick);
  • id'themeToggle' 的按鈕添加點擊事件監聽器。當用戶點擊按鈕時,會調用 handleToggleClick 函數,實現主題切換。

總結

這段程式碼實現了以下功能:

  1. 根據本地儲存或系統偏好來初始化並應用主題(淺色或深色)。
  2. 用戶點擊按鈕後,會切換主題,並將新的主題偏好儲存到本地瀏覽器中。

最後我們只要將這個元件引用到header元件,並且補上全域的樣式就大功告成啦

https://ithelp.ithome.com.tw/upload/images/20241007/20169170g0S4cxK2nK.png

https://ithelp.ithome.com.tw/upload/images/20241007/20169170YgKKURva7w.png

結果沒想到我們點擊的時候我們的暗模式好像有點怪怪的:

https://ithelp.ithome.com.tw/upload/images/20241007/20169170OZ9RsnDJK5.png

回去巡一下程式碼才發現原來我們css寫錯啦XD

https://ithelp.ithome.com.tw/upload/images/20241007/20169170NKkc5PIECx.png

讓我們把body換成html,一切就會恢復正常瞜:

html {
	background-color: antiquewhite;
}

https://ithelp.ithome.com.tw/upload/images/20241007/20169170LQsT6Jmzi2.png

這時候就可以看到我們的黑暗模式功能正常了!


上一篇
和2魚坐牢的第二十七天-Astro之指令與島嶼結構概念
下一篇
和2魚坐牢的第二十九天-Astro部落格之vercel佈署
系列文
和鱷魚組長的坐牢30天之vue的簡易todolist和Astro的簡易部落格實現30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言